package com.tdam2011.grupo04;

import java.util.ArrayList;
import java.util.List;

import android.content.Intent;
import android.database.Cursor;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.AdapterView;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageButton;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;
import android.widget.AdapterView.OnItemClickListener;

import com.tdam2011.grupo04.entidades.EmailContacto;

public class HistorialMail extends MasterListActivity implements OnItemClickListener{

	private EmailAdapter adapter;
	
	private ImageButton img_nuevo_mail;
	private TextView txt_nuevo_mail;
		
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.historiales);

		findViewById(R.id.lout_log).setVisibility(LinearLayout.GONE);
		
		img_nuevo_mail= (ImageButton)findViewById(R.id.img_nuevo_mensaje);
		txt_nuevo_mail= (TextView)findViewById(R.id.txt_nuevo_mensaje);
		    
		img_nuevo_mail.setBackgroundResource(R.drawable.mail_72x72);
		txt_nuevo_mail.setText("Nuevo Email");
		    
		//Preparamos la lista de contactos
		this.adapter= new EmailAdapter();
		this.setListAdapter(adapter); 
		    
		this.getListView().setOnItemClickListener(this);
		this.getListView().setTextFilterEnabled(true);
	}
		
	@Override
	protected void onResume(){
		super.onResume();
		cargarEmails();
	}
		
	public void nuevoMensaje(View v){
		Intent intent= new Intent(HistorialMail.this, Email.class);
		startActivityForResult(intent, 2);
	}
	
	@Override
	protected void publishFilterApplied() {
		super.publishFilterApplied();
		this.cargarEmails();
	}
	
	private void cargarEmails(){
		Sql sql = new Sql(this);		
		Cursor cur = sql.getAllEmail();
			
		adapter.clearList();
			
		if (cur.getCount() > 0) {
			ArrayList<EmailContacto> emails = new ArrayList<EmailContacto>();
				
			while (cur.moveToNext()){
				String destino = cur.getString(cur.getColumnIndex("emailDestino"));
				String fecha = cur.getString(cur.getColumnIndex("emailFecha"));
				
				if((destino != null) && (!contactFilterApplied || destino.toLowerCase().startsWith(contactFilter))) {
					EmailContacto email = new EmailContacto();
					email.setValue(destino);
					email.setFechaEnvio(fecha);
											
					if(agregarALista(email, emails))
						emails.add(email);
				}
			}
							
			for(EmailContacto email : emails){
				int cantidad = getCantidadMails(cur, email);
				email.setValue(email.getValue() + " ( " + cantidad + " )");
				adapter.addEmail(email);
			}
	
		}
		cur.close();
		sql.close();
		adapter.notifyDataSetChanged();
	}
	
	public int getCantidadMails(Cursor cur, EmailContacto email){
		cur.moveToFirst();
		boolean seguir = true;
		int cont = 0;
			
		while(seguir){
			String destino = cur.getString(cur.getColumnIndex("emailDestino"));
			if(destino.equals(email.getValue()))
				cont ++;
			seguir = cur.moveToNext();
		}
		return cont;
	}
			
	public boolean agregarALista(EmailContacto email, List<EmailContacto> emails){
		boolean resultado = false;
		if(emails.isEmpty())
			resultado = true;
		else{
			for(EmailContacto e : emails){
				if(e.getValue().equals(email.getValue())){
					resultado = false;
				}
				else
					resultado = true;				
				if(resultado == false)
					return resultado;
			}
		}
		return resultado;
	}	
	
	class EmailAdapter extends BaseAdapter implements Filterable{
		private ArrayList<EmailContacto> mails;
		private LayoutInflater inflater;
		private ContactFilter filter;
	
		public EmailAdapter() {
			mails = new ArrayList<EmailContacto>();
			inflater = LayoutInflater.from(HistorialMail.this);
		}
	
		public void addEmail(EmailContacto email) {
			if (email != null) {
				this.mails.add(email);
			}
		}
			
		public int getCount() {
			return mails.size();
		}
			
		public Object getItem(int position) {
			return mails.get(position);
		}
	
		public long getItemId(int position) {
			return position;
		}
			
		public void clearList(){
			mails.clear();
		}
	
		class Holder {
			private ImageView img_contacto;
			private TextView txt_nombreContacto;
			private TextView txt_fechaEnvio;
			private TextView txt_cuerpoMensaje;
		}
			
		public View getView(int position, View convertView, ViewGroup arg2){
			Holder holder;
			if (convertView == null) {
				convertView = inflater.inflate(R.layout.historiales_fila , null);
				holder = new Holder();
				holder.txt_nombreContacto = (TextView) convertView
						.findViewById(R.id.txt_nombreContacto);
				holder.txt_fechaEnvio = (TextView) convertView
						.findViewById(R.id.txt_fechaMensaje);
				holder.img_contacto = (ImageView) convertView
						.findViewById(R.id.img_contacto);
				holder.txt_cuerpoMensaje = (TextView) convertView
						.findViewById(R.id.txt_cuerpoMensaje);
				convertView.setTag(holder);
			} else {
				holder = (Holder) convertView.getTag();
			}
	
			EmailContacto email = (EmailContacto) getItem(position);
				
			holder.txt_nombreContacto.setText(email.getValue());
			holder.txt_fechaEnvio.setText(email.getFechaEnvio());
	
			holder.img_contacto.setVisibility(ImageView.GONE);
			holder.txt_cuerpoMensaje.setVisibility(TextView.GONE);
				
			return convertView;
		}
		
		@Override
		public Filter getFilter() {
			if (filter == null) {
				filter = new ContactFilter();
			}
			return filter;
		}
	}
		
	@Override
	public void onItemClick(AdapterView<?> arg0, View arg1, int position, long arg3) {
		com.tdam2011.grupo04.entidades.EmailContacto email= (com.tdam2011.grupo04.entidades.EmailContacto)adapter.getItem(position);
		Intent intent= new Intent(HistorialMail.this, com.tdam2011.grupo04.DetalleMail.class);
		String destino = email.getValue().split("\\(")[0].trim();
		intent.putExtra("destino", destino);
		startActivityForResult(intent, 1);
	}
}
